﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModelInterface.h"
#include "WeakReferenceable.h"

namespace gcmp
{
    class UniIdentity;
    enum class ExternalParameterType;
    class IExternalParameterDefinitionGroup;
    class IExternalParameterDefinitionFile;

    /// \brief 外部参数定义项。
    class GCMP_MODEL_INTERFACE_EXPORT IExternalParameterDefinitionItem : public WeakReferenceable
    {
    public:
        /// \brief 获取参数唯一标识符。
        /// \return 参数唯一标识符
        virtual const gcmp::UniIdentity& GetUid() const = 0;

        /// \brief 获取参数名称。
        /// \return 参数名称
        virtual const std::wstring& GetName() const = 0;

        /// \brief 获取参数所在组名称。
        /// \return 参数组名称
        virtual const std::wstring& GetGroupName() const = 0;

        /// \brief 获取参数描述信息。
        /// \return 参数描述信息
        virtual const std::wstring& GetDescription() const = 0;

        /// \brief 获取参数类型。
        /// \return 参数类型
        virtual ExternalParameterType GetParameterType() const = 0;

        /// \brief 获取参数枚举值列表。
        /// \return 参数枚举值列表
        virtual const std::vector<std::pair<std::wstring, std::wstring>>& GetValueList() const = 0;

        /// \brief 获取是否支持用户修改。
        /// \return true可以修改，false不可修改。
        virtual bool IsUserModifiable() const = 0;

        /// \brief 获取是否用户可见。
        /// \return true用户可见，false不可见。
        virtual bool IsUserVisible() const = 0;

        /// \brief 获取所属的组。
        /// \return 所属的组。
        virtual const IExternalParameterDefinitionGroup* GetGroup() const = 0;
    };

    /// \brief 外部参数定义组。
    class GCMP_MODEL_INTERFACE_EXPORT IExternalParameterDefinitionGroup : public WeakReferenceable
    {
    public:

        /// \brief 添加一个自定义外部参数定义项
        ///
        /// \param uid 参数Id
        /// \param name 参数名称
        /// \param description 参数描述信息
        /// \param paramType 参数类型
        /// \param userVisible 是否用户可见
        /// \param userModifiable 用户可修改
        /// \param valueList 值列表
        /// \return 创建出来的外部参数定义项
        virtual IExternalParameterDefinitionItem* AddItem(const UniIdentity& uid, const std::wstring& name, const std::wstring& description, ExternalParameterType paramType, bool isUserVisible, bool isUserModifiable, const std::vector<std::pair<std::wstring, std::wstring>>& valueList) = 0;
        
        /// \brief 移除指定的外部参数定义项。
        ///
        /// \param uid 需要移除的外部参数uid
        /// \return void
        virtual void RemoveItem(const UniIdentity& uid) = 0;
        
        /// \brief 根据uid获取外部参数定义项。
        ///
        /// \param itemUid 外部参数id
        /// \return 外部参数定义项
        virtual const IExternalParameterDefinitionItem* GetItem(const UniIdentity& itemUid) const = 0;
        
        /// \brief 根据名称获取外部参数定义项。
        ///
        /// \param itemName 外部参数名称
        /// \return 外部参数定义项
        virtual const IExternalParameterDefinitionItem* GetItem(const std::wstring& itemName) const = 0;
        
        /// \brief 获取组名称。
        /// \return 组名称
        virtual const std::wstring& GetName() const = 0;
        
        /// \brief 获取该组所有外部参数定义项。
        /// \return 该组所有外部参数定义项
        virtual std::vector<const IExternalParameterDefinitionItem*> GetItems() const = 0;

        /// \brief 获取所属的文件。
        /// \return 所属的文件。
        virtual const IExternalParameterDefinitionFile* GetFile() const = 0;
    };

    /// \brief 外部参数定义文件。
    class GCMP_MODEL_INTERFACE_EXPORT IExternalParameterDefinitionFile : public WeakReferenceable
    {
    public:
        /// \brief 获取唯一单例对象。
        /// \return 唯一单例对象。
        static IExternalParameterDefinitionFile* Instance();

        /// \brief 添加外部参数定义组，如果组已经存在，就返回已经存在的组。
        ///
        /// \param groupName 组名称
        /// \return 外部参数自定义组
        virtual IExternalParameterDefinitionGroup* AddGroup(const std::wstring& groupName) = 0;
        
        /// \brief 删除外部参数定义组。
        ///
        /// \param groupName 组名称
        /// \return void
        virtual void RemoveGroup(const std::wstring& groupName) = 0;
        
        /// \brief 根据组名称获取外部参数定义组。
        ///
        /// \param groupName 组名称
        /// \return 外部参数定义组
        virtual const IExternalParameterDefinitionGroup* GetGroup(const std::wstring& groupName) const = 0;
        
        /// \brief 根据Uid获取外部参数定义项。
        ///
        /// \param itemUid 外部参数定义id
        /// \return 外部参数定义项
        virtual const IExternalParameterDefinitionItem* GetItem(const UniIdentity& itemUid) const = 0;
        
        /// \brief 根据名称获取外部参数定义项。
        ///
        /// \param itemName 名称
        /// \return 外部参数定义项
        virtual const IExternalParameterDefinitionItem* GetItem(const std::wstring& itemName) const = 0;
        
        /// \brief 获取该文件所有的参数定义组。
        /// \return 该文件所有的参数定义组。
        virtual std::vector<const IExternalParameterDefinitionGroup*> GetGroups() const = 0;
        
        /// \brief 从文件加载外部参数定义。
        ///
        /// \param filePath 文件路劲
        /// \return true加载成功，false加载失败
        virtual bool Load(const std::wstring& filePath) = 0;
        
        /// \brief 保存当前内容到外部文件。
        ///
        /// \param filePath 文件路劲
        /// \return true保存成功，false保存失败
        virtual bool Save(const std::wstring& filePath) const = 0;
    };
}
